package com.archtecture.view.beans;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;

import com.archtecture.control.enums.Mensagem;
import com.archtecture.control.enums.Severidade;
import com.archtecture.control.exceptions.MensagemException;
import com.archtecture.control.facades.GenericPersistenceFacadeRemote;
import com.archtecture.control.models.ModelAb;
import com.archtecture.view.utils.UtilWeb;

public abstract class PadraoCrudMB<Model extends ModelAb> extends PadraoTelaAb<Model> {

	/**
	 * 
	 */
	private static final long				serialVersionUID	= -8470404654304368958L;

	private Model							modelSelected;

	private List<Model>						modelList;

	@EJB
	private GenericPersistenceFacadeRemote	persistenceFacade;

	public void cancelar() {
		setEditando(false);
		setModel(null);
	}

	public void deletar() {

		try {
			setModel(getModelSelected());
			doDeletar();
			this.getPersistenceFacade().excluir(getModel());
			this.modelList.remove(this.getModel());
			UtilWeb.enviarMensagem(Severidade.INFO, Mensagem.MSG_SUCESSO_DELETAR);

		} catch (final MensagemException e) {
			UtilWeb.enviarMensagem(e);
		}

		setModel(null);
	}

	public void doDeletar() throws MensagemException {}

	public void doEditar() throws MensagemException {}

	public void doSalvar() throws MensagemException {}

	public void editar() {

		try {

			setModel(getModelSelected());

			if (getModel().getCodigo() == null) {
				throw new MensagemException(Severidade.ERROR, Mensagem.ERRO_REGISTRO_NAO_SELECIONADO);
			}

			doEditar();
			setEditando(true);

			final Model model = sincronizarModelDaLista(getModel().getCodigo());
			setModel(model);
		} catch (final MensagemException e) {
			UtilWeb.enviarMensagem(e);
		}
	}

	/**
	 * @return the modelList
	 */
	public List<Model> getModelList() {
		if (this.modelList == null) {
			this.modelList = new ArrayList<Model>();
		}
		return this.modelList;
	}

	/**
	 * @return the modelSelected
	 */
	public Model getModelSelected() {
		if (modelSelected == null) {
			modelSelected = getInstance();
		}
		return modelSelected;
	}

	/**
	 * @return the persistenceFacade
	 */
	protected GenericPersistenceFacadeRemote getPersistenceFacade() {
		return this.persistenceFacade;
	}

	public boolean isExcluir() {
		if (getModel().getCodigo() == null) {
			UtilWeb.enviarMensagem(Severidade.ERROR, Mensagem.ERRO_REGISTRO_NAO_SELECIONADO);
		}
		return false;
	}

	public void novoItem() {
		setEditando(true);
		setModel(null);
	}

	public void pesquisar() {

		try {

			List<Model> lModelList = null;
			lModelList = getPersistenceFacade().pesquisarLista(getModel());
			if (lModelList.isEmpty()) {
				UtilWeb.enviarMensagem(Severidade.WARN, Mensagem.MSG_PESQUISA_VAZIA);
			}
			setModelList(lModelList);

		} catch (final MensagemException e) {
			UtilWeb.enviarMensagem(e);
		}

	}

	public void salvar() {

		try {

			doSalvar();

			if (getModel().getCodigo() == null || getModel().getCodigo().equals(0)) {
				setModel(getPersistenceFacade().inserir(getModel()));
				getModelList().add(getModel());
				UtilWeb.enviarMensagem(Severidade.INFO, Mensagem.MSG_SUCESSO_SALVAR);
			}

			else {
				getPersistenceFacade().atualizar(getModel());
				UtilWeb.enviarMensagem(Severidade.INFO, Mensagem.MSG_SUCESSO_EDITAR);
			}

			setModel(null);
			setEditando(false);

		} catch (MensagemException e) {
			UtilWeb.enviarMensagem(e);
		} catch (Exception e) {
			System.out.println("Tes");
		}
	}

	/**
	 * @param modelList
	 *            the modelList to set
	 */
	public void setModelList(final List<Model> modelList) {
		this.modelList = modelList;
	}

	/**
	 * @param modelSelected
	 *            the modelSelected to set
	 */
	public void setModelSelected(Model modelSelected) {
		this.modelSelected = modelSelected;
	}

	private Model sincronizarModelDaLista(final Integer codigo) {
		for (final Model model : getModelList()) {
			if (model.getCodigo().equals(codigo)) {
				return model;
			}
		}
		return null;
	}

}
